package ar.edu.utn.frgp.TPFinalBanco.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity()
@Table(name = "Cliente")
public class Cliente implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "dni")
	private String dni;

	@Column(name = "nombre")
	private String nombre;

	@Column(name = "apellido")
	private String apellido;

	@Column(name = "direccion")
	private String direccion;

	@Column(name = "eMail")
	private String mail;

	@Column(name = "contrasenia")
	private String contrasenia;

	@OneToMany(mappedBy = "cliente", fetch = FetchType.EAGER)
	private List<Cuenta> cuentas;

	// **************** CONSTRUCTOR ****************
	public Cliente() {
	}

	public Cliente(String dni, String nombre, String apellido,
			String direccion, String mail, ArrayList<Cuenta> cuentas,
			String contrasenia) {
		super();
		this.dni = dni;
		this.nombre = nombre;
		this.apellido = apellido;
		this.direccion = direccion;
		this.mail = mail;
		this.cuentas = cuentas;
		this.contrasenia = contrasenia;
	}

	// **************** GETTERS Y SETTERS ****************
	public String getContrasenia() {
		return contrasenia;
	}

	public void setContrasenia(String contrasenia) {
		this.contrasenia = contrasenia;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getMail() {
		return mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public String getNombreCompleto() {
		return nombre.concat(" " + apellido);
	}

	// **************** METODOS ****************

	public Integer getCantCuentas() {

		Integer i = 0;

		i = cuentas.size();

		return i;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append(dni);
		builder.append(" - ");
		builder.append(nombre);
		builder.append(" - ");
		builder.append(apellido);
		return builder.toString();
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		if (dni == null) {
			if (other.dni != null)
				return false;
		} else if (!dni.equals(other.dni))
			return false;
		return true;
	}

	public Boolean getTieneCA() {
		for (Cuenta cuentaCliente : this.cuentas ) {
			if (cuentaCliente.getTipo().equals(TipoCuentaEnum.CA)) {
				return true;
			}

		}
		return false;
	}

	public Integer getCantCC() {
		Integer cant = new Integer(0);
		for (Cuenta cuentaCliente : this.cuentas ) {
			if (cuentaCliente.getTipo().equals(TipoCuentaEnum.CC)) {
				cant++;
			}

		}
		return cant;
	}
	
	
}
